import axios from 'axios'
import { ElMessage } from 'element-plus'
import config, { validateConfig } from '../config/index.js'

/**
 * HTTP请求工具
 * 基于axios封装，包含请求拦截、响应拦截、错误处理等功能
 */

// 验证配置
validateConfig()

// 在开发环境下输出配置信息
if (config.isDevelopment) {
  console.log('🚀 API配置信息:')
  console.log('  - 环境:', import.meta.env.MODE)
  console.log('  - API地址:', config.apiBaseUrl)
  console.log('  - 普通请求超时:', config.timeout + 'ms')
  console.log('  - AI请求超时:', config.aiTimeout + 'ms')
}

// 创建普通请求的axios实例
const request = axios.create({
  baseURL: config.apiBaseUrl, // 从配置文件获取API基础URL
  timeout: config.timeout, // 从配置文件获取请求超时时间
  headers: {
    'Content-Type': 'application/json' // 默认请求头
  }
})

// 创建AI专用的axios实例，配置更长的超时时间
const aiRequest = axios.create({
  baseURL: config.apiBaseUrl, // 从配置文件获取API基础URL
  timeout: config.aiTimeout, // 从配置文件获取AI接口超时时间
  headers: {
    'Content-Type': 'application/json' // 默认请求头
  }
})

/**
 * 普通请求拦截器
 * 在请求发送前自动添加Authorization头
 */
request.interceptors.request.use(
  config => {
    // 从本地存储获取token
    const token = localStorage.getItem('token')
    if (token) {
      // 添加Bearer token到请求头
      config.headers.Authorization = `Bearer ${token}`
    }
    return config
  },
  error => {
    console.error('请求错误:', error)
    return Promise.reject(error)
  }
)

/**
 * 普通请求响应拦截器
 * 统一处理响应错误和状态码
 */
request.interceptors.response.use(
  response => {
    // 请求成功，直接返回响应数据
    return response
  },
  error => {
    console.error('响应错误:', error)
    
    if (error.response) {
      // 服务器返回错误状态码
      const { status, data } = error.response
      
      switch (status) {
        case 401:
          // 未授权，清除token并刷新页面
          ElMessage.error('未授权访问，请重新登录')
          localStorage.removeItem('token')
          window.location.reload()
          break
        case 403:
          ElMessage.error('访问被拒绝')
          break
        case 404:
          ElMessage.error('请求的资源不存在')
          break
        case 500:
          ElMessage.error('服务器内部错误')
          break
        default:
          ElMessage.error(data?.message || '请求失败')
      }
    } else if (error.request) {
      // 网络错误
      ElMessage.error('网络连接失败，请检查网络')
    } else {
      // 请求配置错误
      ElMessage.error('请求配置错误')
    }
    
    return Promise.reject(error)
  }
)

/**
 * AI请求拦截器
 * 为AI专用请求添加Authorization头
 */
aiRequest.interceptors.request.use(
  config => {
    // 从本地存储获取token
    const token = localStorage.getItem('token')
    if (token) {
      // 添加Bearer token到请求头
      config.headers.Authorization = `Bearer ${token}`
    }
    return config
  },
  error => {
    console.error('AI请求错误:', error)
    return Promise.reject(error)
  }
)

/**
 * AI请求响应拦截器
 * 针对AI服务的特殊错误处理
 */
aiRequest.interceptors.response.use(
  response => {
    // 请求成功，直接返回响应数据
    return response
  },
  error => {
    console.error('AI响应错误:', error)
    
    if (error.response) {
      // 服务器返回错误状态码
      const { status, data } = error.response
      
      switch (status) {
        case 401:
          // 未授权，清除token并刷新页面
          ElMessage.error('未授权访问，请重新登录')
          localStorage.removeItem('token')
          window.location.reload()
          break
        case 403:
          ElMessage.error('访问被拒绝')
          break
        case 404:
          ElMessage.error('请求的资源不存在')
          break
        case 500:
          ElMessage.error('AI服务器内部错误')
          break
        case 502:
          ElMessage.error('AI服务暂时不可用')
          break
        case 503:
          ElMessage.error('AI服务超载，请稍后重试')
          break
        case 504:
          ElMessage.error('AI服务响应超时，请稍后重试')
          break
        default:
          ElMessage.error(data?.message || 'AI请求失败')
      }
    } else if (error.code === 'ECONNABORTED') {
      // 请求超时
      ElMessage.error('AI服务响应超时，请稍后重试')
    } else if (error.request) {
      // 网络错误
      ElMessage.error('AI服务连接失败，请检查网络')
    } else {
      // 请求配置错误
      ElMessage.error('AI请求配置错误')
    }
    
    return Promise.reject(error)
  }
)

// 导出默认的请求实例
export default request
// 导出AI专用请求实例
export { aiRequest } 